package com.wwj.cases;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONPath;
import com.wwj.Constant.Constant;
import com.wwj.pojo.API;
import com.wwj.pojo.Case;
import com.wwj.pojo.JsonPathValidate;
import com.wwj.pojo.WriteBackData;
import com.wwj.utils.AuthenticationUtils;
import com.wwj.utils.ExcelUtils;
import com.wwj.utils.HttpUtils;
import io.qameta.allure.Step;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.testng.annotations.BeforeSuite;

import java.util.List;
import java.util.Set;


public class BaseCase {
    //定义日志

    private Logger log = Logger.getLogger(BaseCase.class);

//    /**添加回写对象到集合list中
//     * @param
//     * @param content
//     */
//    public void addWriteBackData(Case c, String content){
//        System.out.println("开始会写数据");
//
//        String caseId = c.getCaseId();
//        //字符串类型转换为int类型
//        int rowNum = Integer.parseInt(caseId);
//        int cellNum = Constant.ACTUAL_RESPONSE_DATA_CELLNUM;
//
//        //创建返回值的回写对象
//        WriteBackData wbd = new WriteBackData(rowNum, cellNum, content);
//        //添加到回写的值的集合中
//        ExcelUtils.wdbList.add(wbd);
//
//    }
//
//



    /**进行参数化，参数替换
     * @param params
     * @return
     */
    @Step("参数替换{params}")
    public String paramReplace(String params){
        if (StringUtils.isBlank(params)){
            return "";

        }
        Set<String> keySet = AuthenticationUtils.env.keySet();
        for (String key:keySet){
            String value = AuthenticationUtils.env.get(key);
            params = params.replace(key,value);


        }
        return params;

    }


//    @BeforeSuite
//    public void init(Case c){
//        //套件执行初始化
//        //配置参数化变量
//
//        //获取全局变量，进行替换，未知不知道有几个需要替换的变量
//        String params = paramReplace(c.getParams());
//        System.out.println("params:"+params);
//        String sql = paramReplace(c.getSql());
//        System.out.println("sql:"+sql);
////参数需要设置回去
//        c.setParams(params);
//        c.setSql(sql);
//
//    }

    @Step("数据回写EXCEL")
    public void addWriteBackData(int rowNum,int cellNum,String content){
        log.info("=====开始回写数据=======第"+rowNum+"行，第"+cellNum+"列；");
        WriteBackData wdb = new WriteBackData(rowNum, cellNum, content);
        //添加回写到集合中
        ExcelUtils.wdbList.add(wdb);

    }

    /**传用例信息并且调用Http请求，并返回响应体
     * @param api
     * @param c
     * @return
     */
    @Step("调用接口{api.url}/{c.params}")
   public String call(API api, Case c){

       String url  = api.getUrl();
       log.info("====开始调用接口======="+url);
       String params = c.getParams();
       String type = api.getType();
       String contentType = api.getContentType();

       //测试注册接口
       //面向对象，高内聚（核心方法），低耦合(依赖其他的类完成的功能)

       return HttpUtils.call(url,params,type,contentType);


   }

    /**断言接口响应内容，第一种判断采用json数组的多关键字匹配，第二种采用等值匹配
     * @param c
     * @param content
     * @return
     */

    @Step("开始响应断言{content}")
    public boolean assertResponseData(Case c,String content){
        log.info("=====开始断言响应内容======="+c.getCaseId());
        //3.开始断言
        //3.1获取excel中的期望数据
        String expectData = c.getExpectData();
        //处理期望结果为json格式
        Object parse = JSONObject.parse(expectData);
        //判断parse是json的对象类型还是数组类型
        if(parse instanceof JSONArray){
            //将期望结果转换为json的list集合
            System.out.println("期望结果是JSONArray类型"+parse);
            List<JsonPathValidate> list = JSONObject.parseArray(expectData, JsonPathValidate.class);
            //遍历list取出json字段
            for (JsonPathValidate jpv:list) {
                //通过jsonPath，用期望结果中的表达式获取到实际响应结果中的响应值
                Object actualValue = JSONPath.read(content, jpv.getExpression());

                //获取期望值
                String expectValue = jpv.getValue();
                //期望值和实际值进行比较
                boolean flag = expectValue.equals(actualValue.toString());
                //System.out.println("实际值："+actualValue+"期望值："+jpv.getValue()+"断言结果："+flag);

                if (!flag) {//!false 其中某个断言已经失败，
                    return false;
                }
                //循环过程中flag都为true
            }
            return true;


        }else if(parse instanceof JSONObject){
            System.out.println("期望结果是类型JSONObject"+parse);

            //如果预期结果是对象类型，就采用等值匹配
            boolean flag = expectData.equals(content);
            return flag;

        }
        return false;

    }



}
